package br.com.ff.versao.session;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import br.com.ff.common.exception.EntidadeDuplicadaException;
import br.com.ff.commons.session.Repositorio;
import br.com.ff.versao.dao.VersaDAO;
import br.com.ff.versao.entidade.Versao;
import br.com.ff.versao.to.VersaoTO;

@Stateless
@Local(VersaoLocal.class)
public class VersaoSessionBean implements VersaoLocal {
	
	@EJB
	Repositorio repositorio;
	
	VersaDAO versaDAO;
	
	@SuppressWarnings("unused")
	@PostConstruct
	private void inicializar() {
		versaDAO = repositorio.getVersaoDAO();
	}	

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void atualizar(VersaoTO versaTO) throws EntidadeDuplicadaException {

		validarSalvar(versaTO);
		
		Versao versao = (Versao)versaDAO.findById(Versao.class, versaTO.getId());
		
		versao.setDescricao(versaTO.getDescricao());
		versao.setId(versaTO.getId());
		versao.setVersao(versaTO.getVersao());
		
		versaDAO.atualizar(versao);
	}

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public List<VersaoTO> findAll() {
		
		List<VersaoTO> result = new ArrayList<VersaoTO>();
		List<Versao> versoes = versaDAO.findAll(Versao.class);
		
		for (Versao versao : versoes) {
			result.add(versao.parseVersaoTO());
		}
		
		return result;
	}

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public VersaoTO findById(Long id) {
		Versao versao = (Versao)versaDAO.findById(Versao.class, id);
		
		return versao.parseVersaoTO();
	}

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void remover(Long id) {
		Versao versao = (Versao)versaDAO.findById(Versao.class, id);
		versaDAO.remover(versao);
	}

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public boolean salvar(VersaoTO versaTO) throws EntidadeDuplicadaException {
		
		validarSalvar(versaTO);
		
		Versao versao = new Versao(versaTO);
		versaDAO.salvar(versao);
		return false;
	}
	
	private void validarSalvar(VersaoTO versaoTO) throws EntidadeDuplicadaException {
		List<Versao> versoes = versaDAO.findByParams(versaoTO);
		
		if (!versoes.isEmpty() && 
				!versoes.get(0).getId().equals(versaoTO.getId())) {
			throw new EntidadeDuplicadaException("Ja existe versao: " + versaoTO.getVersao());
		}
	}
}
